AirPlay Android接收端学习一 协议

您所在的位置:网站首页 airplay 端口 AirPlay Android接收端学习一 协议

AirPlay Android接收端学习一 协议

2024-02-29 04:17| 来源: 网络整理| 查看: 265

一 AirPlay 接收端描述

AirPlay是苹果的私有协议,苹果官方未开放api和sdk,目前相对权威的一份非官方协议文档。这篇文档详细描述了aiplay 服务发现、图片、音视频、镜像投屏的相关协议,给我们开发airplay设备提供了很好的参考。但是不足之处是文档已经有6年多时间没有更新过,对于IOS的新变化可能没有完全同步。在开发过程中我们可能会面临一些未知的坑,需要针对具体问题来逐一解决。

1.1 Airplay服务发现

Airplay设备启动之后可以发布两类服务:

1.RAOP (Remote Audio Output Protocol),用于音频传输。

2.AirPlay service 用于图片、视频、镜像等媒体的传输。

实现AIRPLAY协议的APP不需要再做任何配置就能发现同一网络中的接收端设备,这主要得益于Bonjour(基于M-DNS协议实现)。Bonjour:苹果为基于组播域名服务(multicast DNS)的开放性Zeroconf标准所起的名字。Zeroconf (零设置网络标准):全称为Zero configuration networking,中文名则为零配置网络服务标准,是一种用于自动生成可用IP地址的网络技术,不需要额外的手动配置和专属的配置服务器。具体例子为:用户拥有一台apple tv和一台iPhone5s,只要都连入到同一个无线局域网内,iphone4s就会自动找出apple tv,那么在播放音乐或者视频时候,用户只要点击推送,就可以讲音乐和视频推送到apple tv上播放

对于接收端,我们主要关注RAOP服务:

RAOP service from Device Name name: 5855CA1AE288@Device Name type: _raop._tcp port: 49152 txt: txtvers=1 ch=2 cn=0,1,2,3 da=true et=0,3,5 md=0,1,2 pw=false sv=false sr=44100 ss=16 tp=UDP vn=65537 vs=130.14 am=AppleTV2,1 sf=0x4

服务名称由设备的mac地址和设备名称组成。

TXT属性包括:

namevaluedescriptiontxtvers1TXT记录版本ch2音频通道:立体声cn0,1,2,3音频编解码格式et0,3,5支持的加密类型md0,1,2支持的元数据类型pwfalse接收端是否需要密码sr44100音频码率ss16音频采样率tpUDP支持的传输层协议vs130.14服务端版本amAppleTV2,1设备模式

音频编解码

cn描述0PCM1Apple Lossless (ALAC)2AAC3AAC ELD (Enhanced Low Delay)

IOS设备作为AirPlay客户端,发送的音频流默认是ALAC格式,安卓设备作为接收端,系统自带的MediaPlayer无法解码ALAC格式,因此需要先使用开源的代码对ALAC格式的音频流进行解码,解码生成PCM数据,最后可以通过AudioTrack来播放PCM流。

加密类型

et描述0没加密1RSA (AirPort Express)3FairPlay4MFiSAP (3rd-party devices)5FairPlay SAPv2.5

元数据

md描述0text 文本1artwork 插图2progress 播放进度

总结:

通过RAOP服务发现协议中的描述,可以知道Airplay接收端服务的名称、支持的音频编解码格式、加密类型以及音频播放的进度、插入、歌曲和歌手名称等。这些可以满足我们使用IOS手机或者pad向安卓平台AirPlay接收端同步歌曲的基本需求。

二 音频流传输

音频流传输采用RTSP(Real Time Streaming Protocol)协议 (RFC 2326)。实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。

音频传输协议主要包括:RTSP请求、RTP流、音量控制、元数据、认证、远程控制。

2.1 RTSP请求

OPTIONS请求向RTSP服务端询问它支持的方法,以Apple TV为例,它支持:ANNOUNCE, SETUP, RECORD, PAUSE, FLUSH, TEARDOWN, OPTIONS, GET_PARAMETER, SET_PARAMETER, POST and GET.当客户端知道服务端支持的方法之后,便可以通过这些方法名向服务器发送数据来实现指定的功能。我们来详细看一下主要的方法描述:

ANNOUNCE

通过SDP(Session Description Protocol)服务描述协议向RTSP服务端发送音频流数据的属性,编解码器和加密密钥等信息。

RECORD

RECORD请求启动音频流传输

FLUSH

FLUSH请求停止音频流传输

TEARDOWN

结束RTSP会话

2.2 RTP流

音频包完全符合RTP协议。控制和定时分组并不完全符合RTP标准。

2.3 音量控制

通过SET_PARAMETER请求可以用来调节音量。音量值是float类型,-144表示静音,音量范围在-30到0之间。

示例

client → server SET_PARAMETER rtsp://fe80::217:f2ff:fe0f:e0f6/3413821438 RTSP/1.0 CSeq: 6 Session: 1 Content-Type: text/parameters Content-Length: 20 User-Agent: iTunes/10.6 (Macintosh; Intel Mac OS X 10.7.3) AppleWebKit/535.18.5 Client-Instance: 56B29BB6CB904862 DACP-ID: 56B29BB6CB904862 Active-Remote: 1986535575 volume: -11.123877 server → client RTSP/1.0 200 OK Server: AirTunes/130.14 CSeq: 6 2.4 元数据

SET_PARAMETER请求可以用来传输元数据,元数据内容包括:音频名称、作者名字、专辑名称、插图、音频时长。RTP-Info 头部包含了rtptime参数,表示元数据的有效时间。

2.5 认证

发送的音频数据需要通过RSA认证,所有的二进制数据需要使用Base64 (RFC 4648) 进行加密。

客户端:

在ANNOUNCE 请求中,通过Apple-Challenge 发送128位随机数据。

生成一个128位的AES key,使用RSA公钥加密。

服务端:

使用RSA私钥解密AES key,AES key将被用来解密音频数据

使用RSA私钥对Apple-Challenge进行签名,通过Apple-Response头部发送返回结果给客户端

客户端:

使用RSA公钥对Apple-Response进行解密,检查数字与之前发送的数字是否相同。

2.6 远程控制

airplay服务端可以通过DACP (Digital Audio Control Protocol)协议向客户端发送命令:改变当前播放的音轨状态、暂停、重播,调整播放列表等。airplay客户端通过在RTSP请求中包含DACP-ID头文件来告诉服务端自己支持的命令范围。

总结:

airplay客户端通过向服务端发送OPTIONS请求获取服务端支持的方法列表,随后可以向服务端发送这些命令来建立和结束RTSP会话。客户端发送的音频数据需要RSA认证:首先客户端通过RSA公钥加密128位的AES key,然后服务端通过RSA私钥解密key,随后使用解密后的key来解密音频负荷数据包。客户端可以SET_PARAMETER 请求来调节音量,传输音轨名称、专辑名手、作者名称、音轨播放进度等信息。airplay服务端可以通过DACP发送远程控制命令来实现:改变当前播放的音轨状态、暂停、重播,调整播放列表等。

三 代码参考实现

AirReceiver(https://github.com/fgp/AirReceiver)使用Java写的运行在PC端的AirPlay接收端

DroidAirPlay(https://github.com/pentateu/DroidAirPlay) 基于AirReceiver代码转换成安卓项目的实现代码

AndroidAirPlayReceiver(https://github.com/zhhp1121/AndroidAirPlayReceiver)基于DroidAirPlay改造后能直接使用的安卓工程



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3